package algo3.algothief.controlador;

import java.io.BufferedReader;
import java.io.IOException;
import java.util.HashMap;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import algo3.algothief.excepcion.CasoNoIniciadoException;
import algo3.algothief.modelo.Juego;
import algo3.algothief.vista.VistaJuego;


public class ControladorFinalDelJuego {

	private Juego juego;
	
	private VistaJuego vistaDelJuego;
	
	private ControladorInicioDelJuego controladorDelInicioDelJuego;
	
	private boolean seGanoElCaso;
	
	private HashMap<String, Boolean> opcionesParaSeguirJugando;
	private boolean continuaElJuego;
	
//---------------------------------------------------------------------------------------------------------

	public ControladorFinalDelJuego(Juego juegoActual, VistaJuego vista, ControladorInicioDelJuego controlador) {
		this.juego = juegoActual;
		
		this.vistaDelJuego = vista;
		
		this.controladorDelInicioDelJuego = controlador;
		
		this.seGanoElCaso = false;
		
		this.opcionesParaSeguirJugando = this.crearOpcionesParaSeguirJugando();
		this.continuaElJuego = true;
	}
	
//---------------------------------------------------------------------------------------------------------

	private HashMap<String, Boolean> crearOpcionesParaSeguirJugando() {
		HashMap<String, Boolean> opciones = new HashMap<String, Boolean>();
		
		opciones.put("S", true);
		opciones.put("N", false);
		opciones.put("s", true);
		opciones.put("n", false);
		
		return opciones;
	}
	
	private void procesarElEncuentroFinalConElLadron(BufferedReader entradaDeTeclado) throws IOException, CasoNoIniciadoException {
		String estadoDelJuego = juego.verDescripcionDelEstadoDelJuego();
		
		if (estadoDelJuego.matches("Atrapaste al ladron.")) {
			vistaDelJuego.graficarMensajeDeCasoGanado(entradaDeTeclado);
			this.seGanoElCaso = true;
		}
		else if (estadoDelJuego.matches("Se escapo por no tener orden de arresto.")) {
			vistaDelJuego.graficarMensajeDeCasoPerdido(entradaDeTeclado);
			this.seGanoElCaso = false;
		}
		else {
			vistaDelJuego.graficarMensajeDeSeAcaboElTiempo(entradaDeTeclado);
			this.seGanoElCaso = false;
		}
	}
	
	private boolean procesarOpcionParaSeguirJugando(BufferedReader entradaDeTeclado, String nombreDelLadron) throws IOException {
		String entrada = entradaDeTeclado.readLine();
		
		while (!opcionesParaSeguirJugando.containsKey(entrada)) {
			VistaJuego.graficarMensajeDeOpcionElegidaIncorrecta(entradaDeTeclado);
			
			vistaDelJuego.graficarMensajeDeFinalizacionDelCaso(entradaDeTeclado, seGanoElCaso, nombreDelLadron);
			entrada = entradaDeTeclado.readLine();
		}
			
		return opcionesParaSeguirJugando.get(entrada);
	}
	
//---------------------------------------------------------------------------------------------------------

	public void procesarEntradasFinalesDelJugador(BufferedReader entradaDeTeclado) throws ParserConfigurationException, SAXException, IOException, CasoNoIniciadoException {
		this.procesarElEncuentroFinalConElLadron(entradaDeTeclado);
		String nombreDelLadron = juego.verElNombreDelLadronActual();
		
		juego.finalizarCasoActual();
		vistaDelJuego.graficarMensajeDeFinalizacionDelCaso(entradaDeTeclado, seGanoElCaso, nombreDelLadron);

		this.continuaElJuego = this.procesarOpcionParaSeguirJugando(entradaDeTeclado, nombreDelLadron);
		
		if (continuaElJuego)
			controladorDelInicioDelJuego.iniciarNuevoCaso(entradaDeTeclado);
	}
	
	public boolean seEligioSeguirJugando() {
		return this.continuaElJuego;
	}
}
